package swimv2.ejb.control;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.Stateless;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import swimv2.ejb.entity.Capacita;
import swimv2.ejb.entity.CapacitaRichiesta;
import swimv2.ejb.entity.Notifica;
import swimv2.ejb.entity.Utente;
import swimv2.ejb.entity.Notifica.TipoDiNotifica;
import swimv2.ejb.remote.GestioneCapacitaRemote;
import swimv2.ejb.util.GestioneUtenti;


@SuppressWarnings("unchecked")
@Stateless(name="GestioneCapacita") 
public class GestioneCapacita implements GestioneCapacitaRemote {
	@PersistenceContext(unitName="SWIMV2")
	private EntityManager entityManager;
	
	@Override
	public List<CapacitaRichiesta> elencoRichiesteCapacita()
	{
		Query query=entityManager.createQuery("FROM CapacitaRichiesta");
		return (List<CapacitaRichiesta>)query.getResultList(); 
				
		
	}
	@Override
	public List<CapacitaRichiesta> elencoRichiesteCapacita(String username)
	{
		//Query query=entityManager.createQuery("FROM CapacitaRichiesta WHERE richiedente='+username+'");
		//return (List<CapacitaRichiesta>)query.getResultList(); 
		Utente utente = GestioneUtenti.cercaUtente(entityManager, username);
		ArrayList<CapacitaRichiesta> elenco = new ArrayList<CapacitaRichiesta>(utente.getCapacitaRichieste());
		return elenco;
		
		
	}
	
	@Override
	public void richiediCapacita(String username,String nome)
	{//Metodo riservato all'utente
		Utente utente = GestioneUtenti.cercaUtente(entityManager, username);
		CapacitaRichiesta capacita = new CapacitaRichiesta(utente,nome);
		utente.getCapacitaRichieste().add(capacita);

		entityManager.persist(capacita);

		
	}
	
	@Override
	public void registraCapacita(String nome)
	{//Metodo riservato all'amministratore
		Capacita capacita = new Capacita(nome);
		entityManager.persist(capacita);
	}
	
	@Override
	public void confermaCapacita(int id)
	{//Metodo riservato all'amministratore
		CapacitaRichiesta capacitaR = entityManager.find(CapacitaRichiesta.class, id); 
		Capacita capacita = new Capacita(capacitaR.getDescrizione());
		entityManager.persist(capacita);
		entityManager.remove(capacitaR);
		
		Notifica notifica = new Notifica(TipoDiNotifica.AGGIUNTACAPACITA,"Aggiunta capacita "+capacitaR.getDescrizione(),null);
		entityManager.persist(notifica);
		//GestioneUtenti.cercaUtente(entityManager, capacitaR.getRichiedente()).getNotifiche().add(notifica);
		capacitaR.getRichiedente().getNotifiche().add(notifica);

	}
	
	@Override
	public void rifiutaCapacita(int id)
	{//Metodo riservato all'amministratore
		CapacitaRichiesta capacitaR = entityManager.find(CapacitaRichiesta.class, id); 
		entityManager.remove(capacitaR);
		
		Notifica notifica = new Notifica(TipoDiNotifica.AGGIUNTACAPACITA,"Rifiutata capacita "+capacitaR.getDescrizione(),null);
		entityManager.persist(notifica);
		//GestioneUtenti.cercaUtente(entityManager, capacitaR.getRichiedente()).getNotifiche().add(notifica);
		capacitaR.getRichiedente().getNotifiche().add(notifica);

	}
	
	
	
	@Override
	public void dichiaraCapacita(String username,int id)
	{
		Utente utente = GestioneUtenti.cercaUtente(entityManager, username);
		utente.getCapacita().add(trovaCapacita(id));
	}
	
	@Override
	public void dichiaraNonCapacita(String username,int id)
	{
		Utente utente = GestioneUtenti.cercaUtente(entityManager, username);
		utente.getCapacita().remove(trovaCapacita(id));
	}
	
	@Override
	public List<Capacita> elencoCapacitaUtente(String username)
	{
		Query query=entityManager.createQuery("SELECT u.capacita FROM Utente u WHERE u.username='"+username+"'");
		List<Capacita> listaCapacita=(List<Capacita>)query.getResultList();
		return listaCapacita;
	}
	
	@Override
	public List<Capacita> elencoNonCapacitaUtente(String username)
	{//bug, non prendere le sottoclassi
		Query query=entityManager.createQuery("SELECT c FROM Capacita c,Utente u WHERE u.username='"+username+"'  AND c NOT MEMBER OF u.capacita");
		List<Capacita> listaCapacita=(List<Capacita>)query.getResultList();
		return listaCapacita;
	}
	
	
	@Override
	public List<Capacita> getListaCapacita() {
		Query query=entityManager.createQuery("FROM Capacita");
		List<Capacita> listaCapacita=(List<Capacita>)query.getResultList(); 
		
		return listaCapacita;
	}

	private Capacita trovaCapacita(int id)
	{
		Capacita capacita = entityManager.find(Capacita.class, id); 
		return capacita;
	}
	
	
}
